/*
 * 版权所有 (C) 2018 知启蒙(ZHIQIM) 保留所有权利。
 * 
 * 欢迎到知启蒙网站（https://www.zhiqim.com）购买正版软件，知启蒙还提供许多开源框架和软件。
 * 
 * 1、本软件产品所有源代码受《中华人民共和国著作权法》和其他有关法律、法规的保护，其所有知识产权归湖南知启蒙科技有限公司所有；
 * 2、禁止复制和修改。不得复制修改、翻译或改编本软件所有源代码，或者基于本软件产品创作衍生作品；
 * 3、禁止进行逆向工程。不得对本软件的源代码进行逆向工程、反编译或试图以其他方式发现软件的源代码；
 * 4、个别授权：如需进行商业性的销售、复制、分发，包括但不限于软件销售、预装、捆绑等，必须获得知启蒙的书面授权和许可；
 * 5、保留权利：本注释未明示授权的其他一切权利仍归知启蒙所有，任何人使用其他权利时必须获得知启蒙的书面同意。
 */
package net.redxyz.repost.service.task.user;

import java.util.List;

import net.redxyz.repost.service.dao.UserDao;
import net.redxyz.top.data.vas.ArticleUserSubscribe;
import net.redxyz.top.dbo.user.User;
import net.redxyz.top.dbo.user.UserGift;

import org.zhiqim.kernel.logging.Log;
import org.zhiqim.kernel.logging.LogFactory;
import org.zhiqim.kernel.schedule.Task;
import org.zhiqim.kernel.util.DateTimes;
import org.zhiqim.kernel.util.Validates;
import org.zhiqim.orm.ORM;
import org.zhiqim.orm.dbo.Selector;

/**
 * 所有有效用户检查，一天检查一次<br>
 * 
 * 1、对有效用户付费用户进行订购关系判断
 * 2、到期用户设置用户状态为已到期，并关闭自动橱窗、删除用户错误日志
 * 3、正常用户刷新用户授权
 * 
 * @version v1.0.0 @author zouzhigang 2014-3-20 新建与整理
 */
public class UserTokenCheckTask implements Task
{
    private static final Log log = LogFactory.getLog(UserTokenCheckTask.class);
    
    public void execute()
    {//查询订购关系
        long time1 = System.currentTimeMillis();
        String curDate = DateTimes.getDateString();
        int total = 0, num = 0;
        try
        {
            log.info("所有用户检查任务["+curDate+"]开始...");
            Selector selector = new Selector();
            selector.addMaybe("userStatus", 0);             //有效用户
//            selector.addMaybeThenG("versionNo", 1);         //收费用户
            selector.addOrderbyAsc("endDate");              //顺序排序
            List<User> userList = ORM.table().list(User.class, selector);
            
            if(userList.isEmpty())
            {
                log.info("所有用户检查任务[" + curDate + "]没有有效用户");
                return;
            }
            
            total = userList.size();
            for(User user : userList)
            {
                String nick = user.getNick();
                
                //第一查询订购关系，查看是否真正到期
                ArticleUserSubscribe order = UserDao.getUserOrder(nick, 3);
                switch (order.getStatus())
                {
                case ArticleUserSubscribe.UNKNOWN://查询失败
                {
                    log.error("所有用户检查任务[" + nick + "]订购关系失败，下次重试");
                    break;
                }
                case ArticleUserSubscribe.EXPIRE:
                {//用户直接到期或无效
                    UserDao.doCloseUser(user);
                    num++;
                    break;
                }
                case ArticleUserSubscribe.SUCCESS:
                {//根据日期判断是重授权还是到期处理
                    int versionNo = order.getVersionNo();
                    String endDate = order.getEndDate();
                    
                    if(Validates.isEmpty(endDate) || endDate.compareTo(curDate) <= 0)
                    {//订购关系不存在或到期，需要清理
                        UserDao.doCloseUser(user);
                    }
                    else if(versionNo <= 1)
                    {//免费用户检查赠送
                        Selector sel = new Selector("nick", nick);
                        sel.addMaybe("status", 1);
                        sel.addMaybeThenG("versionNo", 1);
                        sel.addMaybeThenG("endDate", curDate);
                        UserGift userGift = ORM.table().item(UserGift.class, sel);
                        if(userGift == null)//用户未赠送，关闭用户
                            UserDao.doCloseUser(user);
                        else
                            UserDao.doRefreshToken(user, versionNo, endDate);
                    }
                    else
                    {//订购关系正确，即更新订购关系并重授权
                        UserDao.doRefreshToken(user, versionNo, endDate);
                    }
                    
                    num ++;
                    break;
                }
                }
            }
        }
        catch(Exception e)
        {
            log.error("所有用户检查任务["+curDate+"]异常", e);
            return;
        }
        
        long time2 = System.currentTimeMillis();
        long handSecond = (time2 - time1) / 1000;
        log.info("所有用户检查任务[总"+total+"人][成功处理"+num+"人]["+handSecond+"秒]...");
    }
}
